<?php 

// +----------------------------  公共控制器 ------------------------------------------

namespace app\controller;
use app\BaseController;
use app\common\service\EmailService;
use app\dto\R;
use app\model\UserInfos;
use think\facade\Request;
use think\facade\Validate; 
use app\common\service\TokenService;
use app\model\UserAddress;
use app\model\UserCollections;

class UserController extends BaseController{

    // 获取用户收藏的商品信息
    public function getUserCollections($userId)
    {
        // 参数验证
        if (empty($userId)) {
            return json(R::error("用户ID为空"));
        }
        
        // 查询用户收藏，商品模型中需要嵌套关联其他模型
        $collections = UserCollections::where('user_id', $userId)
                ->where('status', 1) // 1表示已收藏
                ->with([
                    'goods' => function($query) {
                        // 在关联商品的同时，再关联商品的其他关联
                        $query->with([
                            'labels',
                            'slideshows',
                            'detailImgs',
                            'specifications',
                            'specificationsWithValues'
                        ]);
                    }
                ])
                ->select();
        
        if ($collections->isEmpty()) {
            return json(R::error("没有找到收藏的商品"));
        } else {
            return json(R::result(1, "获取成功", $collections));
        }
    }
    

    // 根据用户ID获取用户的所有收货地址
    public function getUserAddress($userId)
    {
        // 参数验证
        if (empty($userId)) {
            return json(R::error("用户ID为空"));
        }
        
        // 查询用户地址
        $addresses = UserAddress::where('user_id', $userId)->select();
        
        if ($addresses->isEmpty()) {
            return json(R::error("没有找到收货地址"));
        } else {
            return json(R::result(1, "获取成功", $addresses));
        }
    }

    // 新增收货地址
    public function addAddress()
    {
        // 接收参数：用户ID，收货地址信息
        $data = Request::post();
        
        // 参数映射，将前端字段映射到数据库字段
        $addressData = [
            'user_id' => $data['userId'], 
            'user_name' => $data['name'],
            'tel_number' => $data['phone'],
            'postal_code' => $data['zipCode'],
            'province_name' => $data['province'], 
            'city_name' => $data['city'],
            'county_name' => $data['area'],
            'detail_info' => $data['address'],
            'default_address' => $data['isDefault'] ? $data['isDefault'] : 0 // 转换布尔值为整数
        ];
        
        // 创建地址对象，插入字段数据
        $address = new UserAddress($addressData);
        
        // 查看是否要将该地址设置为默认地址
        $isDefault = isset($data['isDefault']) ? $data['isDefault'] : 0; // 是否默认地址，默认为0
        
        // 如果要设置为默认地址，将数据库中的默认地址设置为0
        if ($isDefault) {
            // 先将所有该用户的默认地址设置为非默认
            UserAddress::where('user_id', $addressData['user_id'])
                ->where('default_address', 1)
                ->update(['default_address' => 0]);
        }
        
        // 创建收货地址记录
        if ($address->save()) {
            return json(R::ok('收货地址添加成功'));
        } else {
            return json(R::error('收货地址添加失败'));
        }
    }

    // 检查用户是否收藏商品，根据goods_id 和 user_id进行过滤
    public function checkUserCollection($userId, $goodsId)
    {
        // $userId = Request::post('user_id');
        // $goodsId = Request::post('goods_id');
        // echo $goodsId;
        
        // 参数验证
        if (empty($userId) || empty($goodsId)) {
            return json(R::error("用户ID或商品ID为空"));
        }
        
        // 查询用户收藏
        $collection = UserCollections::where('user_id', $userId)
            ->where('goods_id', $goodsId)
            ->where('status', 1) // 1表示已收藏
            ->find();
        
        if ($collection) {
            return json(R::result(1, "已收藏", true));
        } else {
            return json(R::result(0, "未收藏", false));
        }
    }

    // 测试Token接口
    public function needTokenTest(){
        return json(R::ok("需要token的接口测试成功"));
    }

    // 用户登录
    public function login()
    {
        $email = Request::post('email');
        $password = Request::post('password');
        
        // 参数验证
        if (empty($email) || empty($password)) {
            return json(R::error("邮箱或密码为空"));
        }
        
        // 查询用户
        $user = UserInfos::where('email', $email)->find();
        
        if (!$user || !password_verify($password, $user->password)) {
            return json(R::error("邮箱或密码错误"));
        }
        
        // 生成token
        $tokenService = new TokenService();
        $token = $tokenService->createToken($user->user_id);
        
        // 隐藏敏感信息
        $user->hidden(['password', 'delete_time']);
        
        // 返回用户信息和token
        return json(R::result(1, "登录成功", [
            'user_info' => $user,
            'token' => $token
        ]))->header([
            'Authorization' => 'Bearer ' . $token,
            'Access-Control-Expose-Headers' => 'Authorization'
        ]);
        
    }

    /**
     * 用户注册
     */
    public function register()
    {
        // 接收参数：邮箱地址，，用户名，密码，验证码
        $data = Request::post();
        
        // 验证参数
        $validate = Validate::rule([
            'userName' => 'require|regex:/^[\x{4e00}-\x{9fa5}a-zA-Z0-9_-]{1,20}$/u',
            'password' => 'require|length:6,20',
            'email' => 'require|email',
            'code' => 'require|number|length:6'
        ])->message([
            'userName.require' => '用户名不能为空',
            'userName.regex' => '用户名只能包含中文、字母、数字、下划线和破折号，长度为4-20个字符',
            'password.require' => '密码不能为空',
            'password.length' => '密码长度必须在6-20个字符之间',
            'email.require' => '邮箱不能为空',
            'email.email' => '邮箱格式不正确',
            'code.require' => '验证码不能为空',
            'code.number' => '验证码必须为数字',
            'code.length' => '验证码长度必须为6位'
        ]);
        
        // 检查参数是否符合规则
        if (!$validate->check($data)) {
            return json(R::error($validate->getError()));
        }
        
        // 验证验证码
        $emailService = new EmailService();
        if (!$emailService->verifyCode($data['email'], $data['code'])) {
            return json(R::error('验证码错误或已过期'));
        }
        
        // 检查邮箱是否已注册
        $user = UserInfos::where('email', $data['email'])->find();
        if ($user) {
            return json(R::error('该邮箱已注册'));
        }
        
        // 检查用户名是否已存在
        // $user = UserCollections::where('username', $data['username'])->find();
        // if ($user) {
        //     return json(R::error('用户名已存在'));
        // }
        
        // 创建用户，初始化用户信息
        $user = new UserInfos();
        $user->user_id = uniqid(); // 生成唯一用户ID
        $user->user_picture = 'user_default.png'; // 默认头像
        $user->user_name = $data['userName'];
        $user->admin = 0; // 普通用户
        $user->password = password_hash($data['password'], PASSWORD_DEFAULT); // 使用密码哈希函数加密密码
        $user->email = $data['email'];
        $user->status = 1;
        
        // 保存用户信息
        if ($user->save()) {
            return json(R::ok('注册成功'));
        } else {
            return json(R::error('注册失败'));
        }
    }

    // 找回密码接口，接收邮箱地址，验证码和新密码
    public function resetPassword() 
    {
        // 接收参数：邮箱地址，验证码，新密码
        $data = Request::post();
        
        // 验证参数
        $validate = Validate::rule([
            'email' => 'require|email',
            'code' => 'require|number|length:6',
            'newPassword' => 'require|length:6,20'
        ])->message([
            'email.require' => '邮箱不能为空',
            'email.email' => '邮箱格式不正确',
            'code.require' => '验证码不能为空',
            'code.number' => '验证码必须为数字',
            'code.length' => '验证码长度必须为6位',
            'newPassword.require' => '新密码不能为空',
            'newPassword.length' => '新密码长度必须在6-20个字符之间'
        ]);
        
        // 检查参数是否符合规则
        if (!$validate->check($data)) {
            return json(R::error($validate->getError()));
        }
        
        // 验证验证码
        $emailService = new EmailService();
        if (!$emailService->verifyCode($data['email'], $data['code'])) {
            return json(R::error('验证码错误或已过期'));
        }
        
        // 查询用户
        $user = UserInfos::where('email', $data['email'])->find();
        if (!$user) {
            return json(R::error('该邮箱未注册'));
        }
        
        // 更新密码
        $user->password = password_hash($data['newPassword'], PASSWORD_DEFAULT); // 使用密码哈希函数加密密码
        
        // 保存用户信息
        if ($user->save()) {
            return json(R::ok('密码重置成功'));
        } else {
            return json(R::error('密码重置失败'));
        }
    }


    // ================= 管理端接口 ======================
    function authInfo(){
        // 获取用户名和密码
        $userName = Request::post('userName');
        $password = Request::post('password');

        // 参数验证
        if (empty($userName) || empty($password)) {
            return json(R::error("用户名或密码为空"));
        }

        // 查询用户
        $user = UserInfos::where('user_name', $userName)->find();
        if (!$user || !password_verify($password, $user->password)) {
            return json(R::error("用户名或密码错误"));
        }

        // 生成token
        $tokenService = new TokenService();
        $token = $tokenService->createToken($user->user_id);

        // 隐藏敏感信息
        $user->hidden(['password']);

        // 返回用户信息和token
        return json(R::result(1, "登录成功", $user))->header([
            'Authorization' => 'Bearer ' . $token,
            'Access-Control-Expose-Headers' => 'Authorization'
            ]);
        
    }


    /**
     * 显示用户列表（带分页和搜索）
     *
     * @param Request $request
     * @return Json
     */
    public function index()
    {
        // 获取分页参数和搜索关键字
        $page = Request::post('page');
        $size = Request::post('size');
        $email = Request::post('email');

        // 构建查询
        $query = UserInfos::order('id', 'desc');
        
        // 如果有搜索关键字，添加模糊查询条件
        if (!empty($email)) {
            $query->where('email', 'like', "%{$email}%");
        }
        
        // 执行分页查询
        $result = $query->paginate([
            'list_rows' => $size,
            'page' => $page,
        ]);

        // 隐藏敏感信息
        $result->hidden(['password', 'delete_time']);

        // 构建返回数据
        $data = [
            'records' => $result->items(),
            'total' => $result->total(),
            'size' => $size,
            'current' => $page,
        ];
        
        return json(R::result(1, '获取用户列表成功', $data));
    }

    /**
     * 保存新建的用户
     *
     * @param Request $request
     * @return Json
     */
    public function saveMana()
    {
        $data = Request::post();
        
        // 验证数据
        $validate = Validate::rule([
            'user_name' => 'require|regex:/^[\x{4e00}-\x{9fa5}a-zA-Z0-9_-]{1,20}$/u',
            'password' => 'require|length:6,20',
            'email' => 'require|email'
        ])->message([
            'userName.require' => '用户名不能为空',
            'userName.regex' => '用户名只能包含中文、字母、数字、下划线和破折号，长度为4-20个字符',
            'password.require' => '密码不能为空',
            'password.length' => '密码长度必须在6-20个字符之间',
            'email.require' => '邮箱不能为空',
            'email.email' => '邮箱格式不正确'
        ]);

        // 检查参数是否符合规则
        if (!$validate->check($data)) {
            return json(R::error($validate->getError()));
        }
        
        
        // 加密密码
        if (isset($data['password'])) {
            $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
        }
        
        // 默认状态为启用
        $data['status'] = 1;
        $data["user_picture"] = 'user_default.png'; // 默认头像
        
        try {
            $user = new UserInfos;
            $user->save($data);
            return json(R::result(1, '用户添加成功', $user));
        } catch (\Exception $e) {
            return json(R::error('用户添加失败：' . $e->getMessage()));
        }
    }

    /**
     * 显示指定用户
     *
     * @param int $id
     * @return Json
     */
    public function read(int $id)
    {
        $user = UserInfos::find($id);
        if (!$user) {
            return json(R::error('用户不存在'));
        }
        return json(R::result(1, '获取用户成功', $user));
    }

    /**
     * 更新指定用户
     *
     * @param Request $request
     * @param int $id
     * @return Json
     */
    public function update($id)
    {   
        // 参数验证
        $user = UserInfos::where("user_id", $id)->find();
        if (!$user) {
            return json(R::error('用户不存在'));
        }
        
        // 获取传入的修改数据
        $data = Request::put();
        
        // 如果更新密码，需要加密
        if (isset($data['password']) && !empty($data['password'])) {
            $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
        } else {
            // 如果密码为空，则不更新密码字段
            unset($data['password']);
        }
        
        try {
            $user->save($data);
            return json(R::ok('用户更新成功'));
        } catch (\Exception $e) {
            return json(R::error('用户更新失败：' . $e->getMessage()));
        }
    }

    /**
     * 更改用户状态（启用/禁用）
     *
     * @param int $id
     * @param int $status 1表示启用，0表示禁用
     * @return Json
     */
    public function changeStatus($id, $status)
    {
        if (!in_array($status, [0, 1])) {
            return json(R::error('状态参数错误'));
        }
        
        $user = UserInfos::where("user_id", $id)->find();
        if (!$user) {
            return json(R::error('用户不存在'));
        }
        
        try {
            $user->status = $status;
            $user->save();
            $statusText = $status == 1 ? '启用' : '禁用';
            return json(R::ok("用户{$statusText}成功"));
        } catch (\Exception $e) {
            return json(R::error('状态更新失败：' . $e->getMessage()));
        }
    }


    

}